﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System;

namespace Pittypat
{
    /// <summary>
    /// 定义一个功能参数的相关元数据信息。
    /// </summary>
    [Serializable]
    [AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)]
    public sealed class ParameterAttribute : Attribute
    {
        // 参数位置
        private int position;
        // 参数方向
        private ParameterDirection direction;
        // 参数作用
        private ParameterRole role;
        // 最大长度或最大小数位数
        private int maxLength;
        // 是否固定长度
        private bool fixedLength;
        // 是否仅允许 ASCII 字符
        private bool ascii;

        /// <summary>
        /// 使用参数在功能参数列表中的位置初始化 <see cref="ParameterAttribute"/> 类的新实例。
        /// </summary>
        /// <param name="position">参数的位置，从 0 开始。如果小于 0，则自动默认为 0。</param>
        public ParameterAttribute(int position)
        {
            this.position = position < 0 ? 0 : position;
            this.direction = ParameterDirection.In;
            this.role = ParameterRole.Normal;
            this.maxLength = 0;
            this.fixedLength = false;
            this.ascii = false;
        }

        /// <summary>
        /// 获取参数在参数列表中的位置，从 0 开始。
        /// </summary>
        public int Position
        {
            get
            {
                return this.position;
            }
        }

        /// <summary>
        /// 获取或者设置参数的方向，默认为 In。
        /// </summary>
        public ParameterDirection Direction
        {
            get
            {
                return this.direction;
            }
            set
            {
                this.direction = value;
            }
        }

        /// <summary>
        /// 获取或者设置参数的作用。默认为 Normal。
        /// </summary>
        public ParameterRole Role
        {
            get
            {
                return this.role;
            }
            set
            {
                this.role = value;
            }
        }

        /// <summary>
        /// 获取或者设置字符串或二进制流参数的最大长度，或者十进制数字的小数位数。默认为 0，设置为小于 0 的值时使用 0。
        /// </summary>
        public int MaxLength
        {
            get
            {
                return this.maxLength;
            }
            set
            {
                this.maxLength = value < 0 ? 0 : value;
            }
        }

        /// <summary>
        /// 获取或者设置一个值，该值指示字符串或二进制流的长度是固定值。默认为 false。
        /// </summary>
        public bool FixedLength
        {
            get
            {
                return this.fixedLength;
            }
            set
            {
                this.fixedLength = value;
            }
        }

        /// <summary>
        /// 获取或者设置一个值，该值指示字符串是否仅仅包含 ASCII 字符。默认为 false。
        /// </summary>
        public bool Ascii
        {
            get
            {
                return this.ascii;
            }
            set
            {
                this.ascii = value;
            }
        }
    }
}
